package cn.edu.cug.cs.gtl.store.sys;

import cn.edu.cug.cs.gtl.common.Pair;
import cn.edu.cug.cs.gtl.protos.*;
import cn.edu.cug.cs.gtl.sql.druid.DruidWrapper;
import cn.edu.cug.cs.gtl.sql.executor.SQLExecutor;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.util.List;

public class UserStore {
    /**
     * 从数据库中提取用户名和密码，验证用户传入的用户名和密码是否正确
     * @param userTableKey 存放用户信息的表
     *  create table sys_user (
     *   user_id           bigint(20)      not null auto_increment    comment '用户ID',
     *   dept_id           bigint(20)      default null               comment '部门ID',
     *   user_name         varchar(30)     not null                   comment '用户账号',
     *   nick_name         varchar(30)     not null                   comment '用户昵称',
     *   user_type         varchar(2)      default '00'               comment '用户类型（00系统用户）',
     *   email             varchar(50)     default ''                 comment '用户邮箱',
     *   phonenumber       varchar(11)     default ''                 comment '手机号码',
     *   sex               char(1)         default '0'                comment '用户性别（0男 1女 2未知）',
     *   avatar            varchar(100)    default ''                 comment '头像地址',
     *   password          varchar(100)    default ''                 comment '密码',
     *   status            char(1)         default '0'                comment '帐号状态（0正常 1停用）',
     *   del_flag          char(1)         default '0'                comment '删除标志（0代表存在 2代表删除）',
     *   login_ip          varchar(128)    default ''                 comment '最后登录IP',
     *   login_date        datetime                                   comment '最后登录时间',
     *   create_by         varchar(64)     default ''                 comment '创建者',
     *   create_time       datetime                                   comment '创建时间',
     *   update_by         varchar(64)     default ''                 comment '更新者',
     *   update_time       datetime                                   comment '更新时间',
     *   remark            varchar(500)    default null               comment '备注',
     *   primary key (user_id)
     * ) engine=innodb auto_increment=100 comment = '用户信息表';
     * @param username
     * @param password
     * @return
     * @throws Exception
     */
    public static boolean check(TableKey userTableKey, String username, String password) throws Exception{
        boolean isValid = false;
        try {
            Parameters ps = Parameters.newBuilder()
                    .addParameter(Parameter.newBuilder().setName("user_name").setValue(username).build())
                    .addParameter(Parameter.newBuilder().setName("password").setValue(MD5(password)).build())
                    .build();
            Tuples tuples = SQLExecutor.select(userTableKey,ps);

            if(tuples!=null && tuples.getTupleCount()>=1)
                return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }






    /**
     * MD5加密字符串
     * @param password
     * @return
     */
    public static String MD5(String password) {
        String md5 = null;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] hash = md.digest(password.getBytes("UTF-8"));
            StringBuilder sb = new StringBuilder(2 * hash.length);
            for (byte b : hash) {
                sb.append(String.format("%02x", b & 0xff));
            }
            md5 = sb.toString();
        } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return md5;
    }


    /**
     * 获取用户表的结构信息
     * @param key
     * @return
     * @throws Exception
     */
    public static TableInfo getTableInfo(TableKey key) throws Exception{
        return SQLExecutor.getTableInfo(key);
    }


    public static Tuples getUser(TableKey userTableKey, int userID) throws Exception{
        Parameters ps = Parameters.newBuilder()
                .addParameter(Parameter.newBuilder().setName("user_id").setValue(String.valueOf(userID)).build())
                .build();
        return  SQLExecutor.select(userTableKey,ps);
    }

}
